﻿using System;
using System.IO;
using System.Text;

namespace CTS.Tools.CreateData
{
    /// <summary>
    /// Program
    /// </summary>
    class Program
    {
        /// <summary>
        /// Tạo cơ sở dữ liệu
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            // Cấu hình UTF8
            Console.OutputEncoding = Encoding.UTF8;
            // Thông báo
            Console.WriteLine("Bat dau tien hanh xu ly tao database...");
            // Lấy đường dẫn hiện tại
            var path = Directory.GetCurrentDirectory();
            // Trường hợp có input đường dẫn
            if (args.Length > 0) {
                path = args[0];
            }
            // Trường hợp không tồn tại đường dẫn
            if (!Directory.Exists(path) || File.Exists(path)) {
                // Thông báo
                Console.Error.WriteLine("Duong dan khong ton tai");
                return;
            }
            // Lấy thông tin folder
            var folder = new DirectoryInfo(path);
            // Tạo data context
            var context = new EntitiesDataContext();
            // Trường hợp database tồn tại
            if (context.DatabaseExists()) {
                // Thông báo
                Console.WriteLine("Dang tien hanh xoa database...");
                // Xóa database
                context.DeleteDatabase();
                // Thông báo
                Console.WriteLine("Da xoa database thanh cong!");
            }
            // Thông báo
            Console.WriteLine("Dang tien hanh tao database moi...");
            // Tạo database
            context.CreateDatabase();
            // Thông báo
            Console.WriteLine("Da tao database thanh cong!");
            // Diệt các folder con trong folder input
            foreach (var subfolder in folder.GetDirectories()) {
                // Trường hợp là folder DDL
                if (subfolder.Name == "00_DDL") {
                    // Thông báo
                    Console.WriteLine("Dang tien hanh doc noi dung trong folder [00_DDL]...");
                    // Khai báo biến dùng trong loop
                    int i = 0; string sql; string[] commands;
                    // Diệt các file sql trong folder
                    foreach (var file in subfolder.GetFiles("*.sql")) {
                        // Thông báo
                        Console.WriteLine(string.Format("Dang tien hanh doc noi dung file [{0}]...", file.Name));
                        // Lấy nội dung file sql
                        sql = ToString(file.OpenRead());
                        // Tách các command trong sql
                        commands = sql.Split(
                            new string[] { "GO\r\n", "GO ", "GO\t" },
                            StringSplitOptions.RemoveEmptyEntries);
                        // Diệt các command đã tách
                        foreach (var cmd in commands) {
                            context.ExecuteCommand(cmd);
                            context.SubmitChanges();
                        }
                        // Thông báo
                        Console.WriteLine(string.Format("Da thuc thi noi dung file [{0}] thanh cong!", file.Name));
                        // Tính số file xử lý
                        i++;
                    }
                    // Thông báo
                    Console.WriteLine(string.Format("Da xu ly {0} file trong folder [00_DDL] thanh cong!", i));
                }
            }
            // Xóa table TblTmp
            context.ExecuteCommand("DROP TABLE TblTmp");
            context.SubmitChanges();
            // Thông báo
            Console.WriteLine("Tao database thanh cong!");
        }

        /// <summary>
        /// Đọc nội dung file từ stream
        /// </summary>
        /// <param name="stream">Stream file</param>
        /// <returns>Chuỗi nội dung file</returns>
        public static string ToString(Stream stream)
        {
            // Khai báo biến cục bộ
            var sb = new StringBuilder();
            // Tiến hành đọc file
            using (StreamReader reader = new StreamReader(stream)) {
                sb.Clear();
                var line = string.Empty;
                while ((line = reader.ReadLine()) != null) {
                    sb.AppendLine(line);
                }
            }
            // Kết quả trả về
            return sb.ToString();
        }
    }
}